package com.redepronik.negosysdis.seguridad.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;

import com.redepronik.negosys.seguridad.entity.Rol;
import com.redepronik.negosys.seguridad.entity.Rolusuario;
import com.redepronik.negosys.seguridad.entity.Usuario;
import com.redepronik.negosys.seguridad.service.RolService;
import com.redepronik.negosys.seguridad.service.UsuarioService;

@Controller
public class UsuarioBean implements Serializable {

	private static final long serialVersionUID = 1L;

	@Autowired
	UsuarioService usuarioService;

	@Autowired
	RolService rolService;

	private List<Usuario> listaUsuarios;

	private Usuario usuario;

	private Rol rol;

	private Rolusuario rolUsuario;

	private String claveActual;

	private String claveNueva1;

	private String claveNueva2;

	private String mensaje;

	private FacesMessage msg;

	private String criterioBusquedaUsuario;

	public UsuarioBean() {
		rol = new Rol();
		usuario = new Usuario();
	}

	public void actualizar(ActionEvent actionEvent) {
		if (getClaveNueva1() != null && getClaveNueva2() != null) {
			if (usuarioService
					.compararClave(getClaveNueva1(), getClaveNueva2())) {

				String password = usuarioService.generarClave(getClaveNueva1());
				usuario.setPassword(password);
				String mensaje = usuarioService.actualizar(usuario);
				mensaje(mensaje, "ACTUALIZÓ");

			} else {
				msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "ERROR",
						"LAS CONTRASEÑAS NO COINCIDEN");
				FacesContext.getCurrentInstance().addMessage(null, msg);
			}
		} else {
			String mensaje = usuarioService.actualizar(usuario);
			mensaje(mensaje, "ACTUALIZÓ");
		}
	}

	public String cambiarClave() {
		String retorno = null;
		usuario = usuarioService.obtenerPorLoginSimple(SecurityContextHolder
				.getContext().getAuthentication().getName());

		String password = usuarioService.generarClave(getClaveActual());

		if (usuarioService.compararClave(usuario.getPassword(), password)) {
			if (usuarioService
					.compararClave(getClaveNueva1(), getClaveNueva2())) {

				password = usuarioService.generarClave(getClaveNueva1());
				usuario.setPassword(password);
				usuarioService.actualizar(usuario);
				msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "CAMBIO",
						"EXITOSO");
				FacesContext.getCurrentInstance().addMessage(null, msg);
				retorno = "home";
			} else {
				msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "ERROR",
						"LAS CONTRASEÑAS NO COINCIDEN");
				FacesContext.getCurrentInstance().addMessage(null, msg);
			}
		} else {
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "ERROR",
					"LA CONTRASEÑA ACTUAL NO COINCIDE");
			FacesContext.getCurrentInstance().addMessage(null, msg);
		}
		return retorno;
	}

	public void cambiarPregunta() {
		if (usuario.getEnabled()) {
			setMensaje("¿ DESEA DESACTIVAR EL USUARIO ?");
		} else {
			setMensaje("¿ DESEA ACTIVAR EL USUARIO ?");
		}
	}

	public void eliminar(ActionEvent actionEvent) {
		usuarioService.eliminar(usuario);
		if (usuario.getEnabled()) {
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "ACTIVO",
					"USUARIO: " + usuario.getNombre());
		} else {
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "DESACTIVO",
					"USUARIO: " + usuario.getNombre());
		}

		FacesContext.getCurrentInstance().addMessage(null, msg);

	}

	public void eliminarRol(ActionEvent actionEvent) {
		usuario.removeRolusuario(rolUsuario);
	}

	public String getClaveActual() {
		return claveActual;
	}

	public String getClaveNueva1() {
		return claveNueva1;
	}

	public String getClaveNueva2() {
		return claveNueva2;
	}

	public String getCriterioBusquedaUsuario() {
		return criterioBusquedaUsuario;
	}

	public List<Usuario> getListaUsuarios() {
		return listaUsuarios;
	}

	public String getMensaje() {
		return mensaje;
	}

	public Rol getRol() {
		return rol;
	}

	public Rolusuario getRolUsuario() {
		return rolUsuario;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	@PostConstruct
	public void init() {
	}

	public void insertar(ActionEvent actionEvent) {
		if (getClaveNueva1() != null && getClaveNueva2() != null) {
			if (usuarioService
					.compararClave(getClaveNueva1(), getClaveNueva2())) {

				String password = usuarioService.generarClave(getClaveNueva1());
				usuario.setPassword(password);
				String mensaje = usuarioService.insertar(usuario);
				mensaje(mensaje, "INSERTÓ");
			} else {
				msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "ERROR",
						"LAS CONTRASEÑAS NO COINCIDEN");
				FacesContext.getCurrentInstance().addMessage(null, msg);
			}
		} else {
			String mensaje = usuarioService.insertar(usuario);
			mensaje(mensaje, "INSERTÓ");
		}
		listaUsuarios = usuarioService.obtener();
	}

	public void insertarRol(ActionEvent actionEvent) {
		if (usuario.getRolusuarios() == null)
			usuario.setRolusuarios(new ArrayList<Rolusuario>());

		List<Rolusuario> list = usuario.getRolusuarios();
		Rol r = rolService.obtenerPorRolId(rol.getRolid());
		boolean bn = true;
		for (Rolusuario rolUsuario : list) {
			if (rolUsuario.getRol().getRolid() == r.getRolid()) {
				bn = false;
				msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERROR",
						"YA AGREGO EL ROL: " + r.getNombre());
				FacesContext.getCurrentInstance().addMessage(null, msg);
				break;
			}
		}
		if (bn) {
			Rolusuario e = new Rolusuario();
			e.setRol(r);
			usuario.addRolusuario(e);
		}
		rol = new Rol();
	}

	public void limpiar() {
		usuario = new Usuario();
		claveNueva1 = "";
		claveNueva2 = "";
	}

	private void mensaje(String mensaje, String titulo) {
		RequestContext context = RequestContext.getCurrentInstance();
		if (mensaje.compareTo("SAVE") == 0) {
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO, titulo,
					"USUARIO " + usuario.getNombre());
			context.addCallbackParam("error", true);
			limpiar();
		} else {
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "ERROR", mensaje);
			context.addCallbackParam("error", false);
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public void obtenerUsuarios() {
		if (criterioBusquedaUsuario.compareToIgnoreCase("") == 0)
			presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
					"MENSAJE DEL SISTEMA", "INGRESE UN CRITERIO DE BUSQUEDA"));
		else {
			if (criterioBusquedaUsuario.length() > 3) {
				listaUsuarios = new ArrayList<Usuario>();
				listaUsuarios = usuarioService
						.obtenerTodosPorBusqueda(criterioBusquedaUsuario
								.toUpperCase());
				criterioBusquedaUsuario = new String();
				if (listaUsuarios.isEmpty()) {
					presentaMensaje(new FacesMessage(
							FacesMessage.SEVERITY_INFO, "MENSAJE DEL SISTEMA",
							"NO SE ENCONTRO NINGUNA COINCIDENCIA"));
				}
			} else
				presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
						"MENSAJE DEL SISTEMA", "INGRESE MINIMO 3 CARACTERES"));
		}
	}

	private void presentaMensaje(FacesMessage message) {
		FacesContext.getCurrentInstance().addMessage(null, message);
	}

	public void setClaveActual(String claveActual) {
		this.claveActual = claveActual;
	}

	public void setClaveNueva1(String claveNueva1) {
		this.claveNueva1 = claveNueva1;
	}

	public void setClaveNueva2(String claveNueva2) {
		this.claveNueva2 = claveNueva2;
	}

	public void setCriterioBusquedaUsuario(String criterioBusquedaUsuario) {
		this.criterioBusquedaUsuario = criterioBusquedaUsuario;
	}

	public void setListaUsuarios(List<Usuario> listaUsuarios) {
		this.listaUsuarios = listaUsuarios;
	}

	public void setMensaje(String mensaje) {
		this.mensaje = mensaje;
	}

	public void setRol(Rol rol) {
		this.rol = rol;
	}

	public void setRolUsuario(Rolusuario rolUsuario) {
		this.rolUsuario = rolUsuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
}
